import { message } from 'ant-design-vue'
import { ref } from 'vue'
import * as XLSX from 'xlsx'

/**
 * @name 防抖函数
 * @param {Function} callback 回调函数
 * @param {Number} delay 延迟时间，默认为 500ms
 * @param {Boolean} immediate 是否立即执行，默认为 false
 * @returns {Function} 防抖函数
 */
export const useDebounce = (callback, delay = 500, immediate = false) => {
  if (typeof callback !== 'function') {
    throw new Error('callback 必须是一个函数')
  }
  if (typeof delay !== 'number' || delay < 0) {
    throw new Error('delay 必须是一个正整数')
  }
  if (typeof immediate !== 'boolean') {
    throw new Error('immediate 必须是一个布尔值')
  }
  // 定时器
  const timer = ref(null)
  // 立即执行
  let isInvoke = immediate
  // 防抖函数
  const debouncedCallback = (...args) => {
    // 清除定时器
    if (timer.value) {
      clearTimeout(timer.value)
    }
    // 立即执行
    if (isInvoke) {
      isInvoke = false
      // 执行回调函数
      callback(...args)
    } else {
      // 延迟执行
      timer.value = setTimeout(() => {
        // 执行回调函数
        callback(...args)
        // 清除定时器
        timer.value = null
      }, delay)
    }
  }
  // 返回防抖函数
  return debouncedCallback
}
/**
 * @name 节流函数
 * @param {Function} callback 回调函数
 * @param {Number} delay 延迟时间，默认为 500ms
 * @param {Boolean} immediate 是否立即执行，默认为 false
 * @returns {Function} 节流函数
 */
export const useThrottle = (callback, delay = 500, immediate = false) => {
  if (typeof callback !== 'function') {
    throw new Error('callback 必须是一个函数')
  }
  if (typeof delay !== 'number' || delay < 0) {
    throw new Error('delay 必须是一个正整数')
  }
  if (typeof immediate !== 'boolean') {
    throw new Error('immediate 必须是一个布尔值')
  }
  // 定时器
  const timer = ref(null)
  // 立即执行
  let isInvoke = immediate
  // 节流函数
  const throttleCallback = (...args) => {
    // 清除定时器
    if (timer.value) {
      clearTimeout(timer.value)
    }
    // 立即执行
    if (isInvoke) {
      isInvoke = false
      // 执行回调函数
      callback(...args)
    } else {
      // 延迟执行
      timer.value = setTimeout(() => {
        // 执行回调函数
        callback(...args)
        // 清除定时器
        timer.value = null
      }, delay)
    }
  }
  // 返回节流函数
  return throttleCallback
}

/**
 * @name 导出Excel
 * @param {Array} data 数据
 * @param {String} fileName 文件名
 */
export const exportExcel = (data, fileName = '数据导出') => {
  try {
    // 转换数据为工作簿
    const worksheet = XLSX.utils.json_to_sheet(data)
    const workbook = XLSX.utils.book_new()
    XLSX.utils.book_append_sheet(workbook, worksheet, '数据')

    // 生成Excel文件并下载
    XLSX.writeFile(workbook, `${fileName}.xlsx`)
  } catch (err) {
    console.error('导出Excel失败:', err)
    message.error('导出Excel失败，请联系管理员')
  }
}
